package main

import (
	"fmt"
	"sort"
	"math/rand"
)

// 1 声明Hero结构体
type Hero struct{
	Name string
	Age int
}

// 声明一个Hero结构体切片
type HeroSlice []Hero


/*
type Interface
type Interface interface {
    // Len方法返回集合中的元素个数
    Len() int
    // Less方法报告索引i的元素是否比索引j的元素小
    Less(i, j int) bool
    // Swap方法交换索引i和j的两个元素
    Swap(i, j int)
}
一个满足sort.Interface接口的（集合）类型可以被本包的函数进行排序。方法要求集合中的元素可以被整数索引。
*/
// 实现Interface 接口
func (hs HeroSlice) Len() int{
	return len(hs)
}
// less 方法就是决定你使用什么标准进行排序
// 1 按Hero的年龄从小到大排序
func (hs HeroSlice)Less(i,j int)bool  {
	return hs[i].Age <hs[j].Age
	// 修改成对Name的排序
	// return hs[i].Name<hs[j].Name
}

func (hs HeroSlice)Swap(i,j int)  {
	// 交换
	// temp :=hs[j]
	// hs[i] = hs[j]
	// hs [j] = temp
	// 以上三句等同 下方一句话
	hs[i],hs[j] = hs[j],hs[i]
	
}

// 声明Student结构体
type Student struct{
	Name string
	Age int
	Score float64

}

// 将Student 的切片，安Score 从大到小排序

func main(){
	// 先定义一个数组/切片
	var intSlice = []int{0,-1,10,7,90}
	// 要求对intSlice 切片进行排序
	// 1. 冒泡排序法
	// 2. 使用系统提供的方法
	sort.Ints(intSlice)
	fmt.Println(intSlice)


	// 对结构体切片进行排序
	// 1. 冒泡排序
	// 2. 也可以使用系统提供的方法
	
	
	var heroes HeroSlice
	for i:=0;i<10;i++{
		hero := Hero{
			Name :fmt.Sprintf("英雄|%d",rand.Intn(100)),
			Age : rand.Intn(100),
		}
		// 将 hero append 到 heroSlice 切片
		heroes = append(heroes,hero)
	}

	// 看看排序前排序
	for _,v := range heroes{
		fmt.Println(v)
	}
	// 调用sort
	sort.Sort(heroes)
	fmt.Println("----排序后----")
	// 看看排序后顺序
	for _,v := range heroes{
		fmt.Println(v)
	}

	i :=10
	j := 20
	i,j=j,i

	fmt.Println("i=","j=",j)// i=20,j=10
}